<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>OF</title>
</head><body>为什么要引入DT.<br/>
"This whole ARM thing is a fucking pain in the ass"---Linus Torvalds<br/>
<br/>
OF == Openfirmware<br/>
Devices Tree 是一种描述硬件的数据结构.<br/>
<br/>
-------------------------------<br/>
CPU 的数量和类别<br/>
内存基地址和大小<br/>
总线和桥<br/>
外设连接<br/>
中断控制器和中断使用情况<br/>
GPIO 控制器和 GPIO 使用情况<br/>
Clock 控制器和 Clock 使用情况<br/>
-------------------------------<br/>
<br/>
将硬件信息用.dts文件表示.BOOTLOAD将信息传递给内核.<br/>
硬件在初始化调用聘任probe()函数时.调用of_xxx_register_devices()自动展开配置信息.<br/>
<br/>
DTB Creat &amp; Parser:<br/>
#arch/arm/boot/dts/Makefile will be call scripts/dtc/dtc to creat &nbsp;platfrom dtb.It will be like this:<br/>
scripts/dtc/dtc -O dtb -o arch/arm/boot/dts/rk3288-box-rk808.dtb -i <br/>
<br/>
#API<br/>
$KERNEL/include/linux/of.h<br/>
#Doc<br/>
Documentation/devicetree<br/>
#Usage<br/>
http://devicetree.org/Device_Tree_Usage<br/>
#Dts File Format<br/>
/ &nbsp;//root node<br/>
string-property = "string" // string value<br/>
cell-property = &lt;0xbeef 123 0xabcd1234&gt; &nbsp;//32bit unsigned intergers value<br/>
binary-property = [0x01 0x23 0x45 0x67] &nbsp;//binary data<br/>
mix-property = "string", [0x10 0x23 0x45 0x67], &lt;0xadcd1234&gt; //multi type data.<br/>
string-list = "red fish", "blue fish", "white fish"<br/>
<br/>
// 可寻址设备<br/>
reg = &lt;address lenth&gt; //地址+寻址范围<br/>
#address-cells<br/>
#size-cells<br/>
其中reg的组织形式为:<br/>
reg = &lt;address1 length1 [address2 length2] [address3 length3] ... &gt;.<br/>
其中的每一组address length表明了设备使用的一个地址范围.<br/>
address为1个或多个32位的整型(即cell).<br/>
而length则为cell的列表或者为空 (若#size-cells = 0).<br/>
address 和 length 字段是可变长的.<br/>
<br/>
父结点的#address-cells和#size-cells分别决定了子结点的reg属性的address和length字段的长度.<br/>
在本例中，root结点的#address-cells = &lt;1&gt;;和#size-cells = &lt;1&gt;;决定了serial、gpio、spi等结点的address和length字段的长度分别为1。cpus 结点的#address-cells = &lt;1&gt;;和#size-cells = &lt;0&gt;;决定了2个cpu子结点的address为1，而length为空，于是形成了2个cpu的reg = &lt;0&gt;;和reg = &lt;1&gt;;。external-bus结点的#address-cells = &lt;2&gt;和#size-cells = &lt;1&gt;;决定了其下的ethernet、i2c、flash的reg字段形如reg = &lt;0 0 0x1000&gt;;、reg = &lt;1 0 0x1000&gt;;和reg = &lt;2 0 0x4000000&gt;;。其中，address字段长度为0，开始的第一个cell（0、1、2）是对应的片选，第2个cell（0，0，0）是相 对该片选的基地址，第3个cell（0x1000、0x1000、0x4000000）为length。特别要留意的是i2c结点中定义的 #address-cells = &lt;1&gt;;和#size-cells = &lt;0&gt;;又作用到了I2C总线上连接的RTC，它的address字段为0x58，是设备的I2C地址。<br/>
<br/>
</body></html>